#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
简化版分栏PDF转换工具
快速处理单个PDF文件的分栏格式问题
"""

import os
import pdfplumber
import re
from typing import List, Tuple, Optional

def quick_column_detect(page):
    """
    快速分栏检测（简化版）
    
    Args:
        page: pdfplumber页面对象
    
    Returns:
        list: 栏边界列表或None
    """
    page_width = page.width
    chars = page.chars
    
    if not chars or len(chars) < 20:
        return None
    
    # 简单策略：检查左半部分和右半部分是否都有足够的文本
    mid_x = page_width / 2
    left_chars = [c for c in chars if c['x0'] < mid_x]
    right_chars = [c for c in chars if c['x0'] >= mid_x]
    
    # 如果左右两侧都有足够的文本，认为是双栏
    if len(left_chars) > 10 and len(right_chars) > 10:
        return [(0, mid_x), (mid_x, page_width)]
    
    return None

def extract_column_text_simple(page, column_bounds):
    """
    简单的栏文本提取
    
    Args:
        page: pdfplumber页面对象
        column_bounds: 栏边界 (x0, x1)
    
    Returns:
        str: 提取的文本
    """
    x0, x1 = column_bounds
    
    # 裁剪栏区域
    column_area = page.crop((x0, 0, x1, page.height))
    text = column_area.extract_text()
    
    return text.strip() if text else ""

def simple_clean_text(text):
    """
    简单的文本清理
    
    Args:
        text: 原始文本
    
    Returns:
        str: 清理后的文本
    """
    if not text:
        return ""
    
    # 移除多余的空格和换行
    text = re.sub(r'\s+', ' ', text)
    text = re.sub(r'\n\s*\n', '\n\n', text)
    
    # 移除可能的页码（纯数字行）
    lines = text.split('\n')
    cleaned_lines = []
    
    for line in lines:
        line = line.strip()
        if line and not (line.isdigit() and len(line) <= 3):
            cleaned_lines.append(line)
    
    return '\n'.join(cleaned_lines).strip()

def convert_pdf_simple(pdf_path, output_path=None):
    """
    简单的PDF转换（专注分栏处理）
    
    Args:
        pdf_path: PDF文件路径
        output_path: 输出文件路径
    
    Returns:
        bool: 转换是否成功
    """
    if not os.path.exists(pdf_path):
        print(f"错误：文件 {pdf_path} 不存在")
        return False
    
    if output_path is None:
        base_name = os.path.splitext(pdf_path)[0]
        output_path = f"{base_name}_simple_column.md"
    
    print(f"开始处理: {os.path.basename(pdf_path)}")
    
    try:
        with pdfplumber.open(pdf_path) as pdf:
            all_content = []
            
            for i, page in enumerate(pdf.pages, 1):
                print(f"处理第 {i} 页...")
                
                # 检测分栏
                columns = quick_column_detect(page)
                
                if columns:
                    # 分栏格式：按栏提取
                    print(f"  检测到 {len(columns)} 栏格式")
                    column_texts = []
                    
                    for j, column_bounds in enumerate(columns, 1):
                        column_text = extract_column_text_simple(page, column_bounds)
                        if column_text:
                            cleaned_text = simple_clean_text(column_text)
                            if cleaned_text:
                                column_texts.append(f"### 第{i}页 第{j}栏\n\n{cleaned_text}")
                    
                    if column_texts:
                        all_content.extend(column_texts)
                else:
                    # 单栏格式：直接提取
                    print("  单栏格式")
                    text = page.extract_text()
                    if text:
                        cleaned_text = simple_clean_text(text)
                        if cleaned_text:
                            all_content.append(f"### 第{i}页\n\n{cleaned_text}")
            
            # 写入文件
            if all_content:
                with open(output_path, 'w', encoding='utf-8') as f:
                    f.write('\n\n---\n\n'.join(all_content))
                
                print(f"转换完成: {output_path}")
                print(f"共处理 {len(pdf.pages)} 页，生成 {len(all_content)} 个内容块")
                return True
            else:
                print("未提取到有效内容")
                return False
    
    except Exception as e:
        print(f"转换失败: {str(e)}")
        return False

def main():
    """
    主函数 - 交互式使用
    """
    print("=== 简化版分栏PDF转换工具 ===")
    print("功能：快速处理分栏格式的PDF文档")
    print("特点：简单、快速、专注分栏问题\n")
    
    # 获取用户输入
    while True:
        pdf_path = input("请输入PDF文件路径（或拖拽文件到此处）: ").strip().strip('"')
        
        if not pdf_path:
            print("路径不能为空，请重新输入")
            continue
        
        if not os.path.exists(pdf_path):
            print(f"文件不存在: {pdf_path}")
            print("请检查路径是否正确\n")
            continue
        
        if not pdf_path.lower().endswith('.pdf'):
            print("请选择PDF文件")
            continue
        
        break
    
    # 询问输出路径
    output_path = input("请输入输出文件路径（回车使用默认路径）: ").strip().strip('"')
    if not output_path:
        output_path = None
    
    # 执行转换
    print("\n开始转换...")
    success = convert_pdf_simple(pdf_path, output_path)
    
    if success:
        print("\n✅ 转换成功！")
        if output_path is None:
            output_path = os.path.splitext(pdf_path)[0] + "_simple_column.md"
        print(f"输出文件: {output_path}")
        
        # 询问是否打开文件
        open_file = input("\n是否打开输出文件？(y/n): ").strip().lower()
        if open_file in ['y', 'yes', '是']:
            try:
                os.startfile(output_path)  # Windows
            except:
                print(f"请手动打开文件: {output_path}")
    else:
        print("\n❌ 转换失败")
    
    input("\n按回车键退出...")

if __name__ == "__main__":
    # 检查是否有命令行参数
    import sys
    
    if len(sys.argv) > 1:
        # 命令行模式
        pdf_path = sys.argv[1]
        output_path = sys.argv[2] if len(sys.argv) > 2 else None
        
        print(f"命令行模式: {pdf_path}")
        success = convert_pdf_simple(pdf_path, output_path)
        
        if success:
            print("转换成功")
        else:
            print("转换失败")
            sys.exit(1)
    else:
        # 交互模式
        main()